package com.yanggu.scala.chapater11.fold

object FoldDemo01 {

  def main(args: Array[String]): Unit = {
    //fold函数将上一步返回的值作为函数的第一个参数继续传递参与运算，直到list中的所有元素被遍历。
    //fold折叠和reduce很相似。reduce可以看做是简化的fold。默认将集合的head作为第一个参数
    val list = List(1, 2, 3, 4)

    def minus(num1: Int, num2: Int) = num1 - num2

    //函数的科里化
    //5 - 1
    //5 - 1 - 2
    //5 - 1 - 2 - 3
    //5 - 1 - 2 - 3 - 4
    println(list.fold(5)(minus))
    //4 - 5
    //3 - (4 - 5)
    //2 - (3 - (4 - 5))
    //1 - (2 - (3 - (4 - 5)))
    println(list.foldRight(5)(minus))

    //foldLeft和foldRight的缩写方法分别是 /:和:\
    println("**********简写写法**********")
    val list1 = List(1, 9)
    //左折叠简写
    val list2 = (1 /: list1) (minus)
    println(list2)

    //右折叠简写
    println((list1 :\ 10) (minus))
  }

}
